package com.itheima.kafka.example4;

import com.alibaba.fastjson.JSON;
import com.itheima.kafka.pojos.Temperature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

/**
 * 温度数据消费者 - 实时监控温度
 */
@Slf4j
@Component
public class TemperatureListener {
    
    // 温度阈值配置
    private static final double HIGH_TEMP_THRESHOLD = 35.0;  // 高温阈值
    private static final double LOW_TEMP_THRESHOLD = 10.0;   // 低温阈值
    
    /**
     * 监听温度数据
     */
    @KafkaListener(topics = "temperature-data", groupId = "temperature-monitor-group")
    public void handleTemperature(String message) {
        try {
            // 解析JSON为Temperature对象
            Temperature temp = JSON.parseObject(message, Temperature.class);
            
            log.info("═══════════════════════════════════════");
            log.info("🌡️ [温度监控] 收到传感器数据");
            log.info("🌡️ 传感器ID: {}", temp.getSensorId());
            log.info("🌡️ 当前温度: {}°C", temp.getTemperature());
            
            // 温度异常检测
            checkTemperatureAlert(temp);
            
            log.info("═══════════════════════════════════════");
            
        } catch (Exception e) {
            log.error("❌ [温度监控] 处理温度数据失败: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 温度告警检测
     */
    private void checkTemperatureAlert(Temperature temp) {
        double temperature = temp.getTemperature();
        String sensorId = temp.getSensorId();
        
        if (temperature > HIGH_TEMP_THRESHOLD) {
            // 高温告警
            log.error("🚨 [温度告警] ⚠️ 高温警告！");
            log.error("🚨 传感器: {} 温度过高: {}°C (阈值: {}°C)", 
                sensorId, temperature, HIGH_TEMP_THRESHOLD);
            log.error("🚨 建议: 立即检查设备，启动散热措施");
            
            // 这里可以调用告警服务，发送邮件、短信等
            sendAlert(sensorId, temperature, "高温");
            
        } else if (temperature < LOW_TEMP_THRESHOLD) {
            // 低温告警
            log.warn("🚨 [温度告警] ⚠️ 低温警告！");
            log.warn("🚨 传感器: {} 温度过低: {}°C (阈值: {}°C)", 
                sensorId, temperature, LOW_TEMP_THRESHOLD);
            log.warn("🚨 建议: 检查环境温度，确保设备正常运行");
            
            sendAlert(sensorId, temperature, "低温");
            
        } else {
            // 正常温度
            log.info("✅ [温度检查] 温度正常 (范围: {}°C - {}°C)", 
                LOW_TEMP_THRESHOLD, HIGH_TEMP_THRESHOLD);
            
            // 可以进行数据统计、存储等操作
            saveTemperatureData(temp);
        }
    }
    
    /**
     * 发送告警通知（模拟）
     */
    private void sendAlert(String sensorId, double temperature, String alertType) {
        log.info("📧 [告警通知] 正在发送{}告警通知...", alertType);
        log.info("📧 [告警通知] 传感器: {}, 温度: {}°C", sensorId, temperature);
        // 实际项目中这里可以集成邮件、短信、钉钉等告警服务
    }
    
    /**
     * 保存温度数据（模拟）
     */
    private void saveTemperatureData(Temperature temp) {
        log.debug("💾 [数据存储] 保存温度数据: {} - {}°C", 
            temp.getSensorId(), temp.getTemperature());
        // 实际项目中这里可以保存到数据库、时序数据库等
    }
}

